﻿//给你一棵二叉树的根节点 root ，返回树的 最大宽度 。
//树的 最大宽度 是所有层中最大的 宽度 。
//每一层的 宽度 被定义为该层最左和最右的非空节点（即，两个端点）之间的长度。
//将这个二叉树视作与满二叉树结构相同，两端点间会出现一些延伸到这一层的 null 节点，
//这些 null 节点也计入长度。
//题目数据保证答案将会在  32 位 带符号整数范围内。
//
//输入：root = [1, 3, 2, 5, 3, null, 9]
//输出：4
//解释：最大宽度出现在树的第 3 层，宽度为 4 (5, 3, null, 9) 。
//
//输入：root = [1, 3, 2, 5, null, null, 9, 6, null, 7]
//输出：7
//解释：最大宽度出现在树的第 4 层，宽度为 7 (6, null, null, null, null, null, 7) 。
//
//输入：root = [1, 3, 2, 5]
//输出：2
//解释：最大宽度出现在树的第 2 层，宽度为 2 (3, 2) 。
//
//提示：
//	树中节点的数目范围是[1, 3000]
//	- 100 <= Node.val <= 100

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),
 * right(right) {}
 * };
 */
class Solution {
public:
    int widthOfBinaryTree(TreeNode* root) {
        vector<pair<TreeNode*, unsigned int>> q; // 用数组模拟队列

        q.push_back({ root, 1 });
        unsigned int ret = 0;
        while (q.size()) {
            // 先更新这⼀层的宽度

            auto& [x1, y1] = q[0];
            auto& [x2, y2] = q.back();
            ret = max(ret, y2 - y1 + 1);
            // 让下⼀层进队

            vector<pair<TreeNode*, unsigned int>> tmp; // 让下⼀层进⼊这个队列

            for (auto& [x, y] : q) {
                if (x->left)
                    tmp.push_back({ x->left, y * 2 });
                if (x->right)
                    tmp.push_back({ x->right, y * 2 + 1 });
            }
            q = tmp;
        }
        return ret;
    }
};